import psycopg2
def simulate_transaction_failure():
    try:
        connection = psycopg2.connect(
        user="postgres",
        password="ffxshlsy666",
        host="localhost",
        port="5432",
        database="transaction_lab"
        )
        
        cursor = connection.cursor()
        
        
        # Débuter la transaction
        connection.autocommit = False
        
        # 1. Lire le solde actuel
        cursor.execute("SELECT balance FROM accounts WHERE account_id= 1")
        initial_balance = cursor.fetchone()[0]
        print(f"Solde initial du compte 1: {initial_balance} €")
        # 2. Débiter le compte 1
        cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE account_id = 1")
        
        # 3. Vérifier le solde mis à jour
        cursor.execute("SELECT balance FROM accounts WHERE account_id= 1")
        updated_balance = cursor.fetchone()[0]
        print(f"Solde après débit: {updated_balance} €")
        
        # 4. Simuler une erreur
        print("Simulation d'une erreur dans la transaction...")
        # Division par zéro pour provoquer une exception
        result = 1 / 0
        
        # 5. Cette partie ne sera jamais exécutée à cause de l'erreur
        cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE account_id = 2")
        
        # 6. Valider la transaction (jamais exécuté)
        connection.commit()
        
    except (Exception, psycopg2.Error) as error:
        # En cas d'erreur, annuler tous les changements
        if connection:
            connection.rollback()
        print(f"Transaction annulée en raison d'une erreur: {error}")
        
        # Vérifier que le solde est revenu à sa valeur initiale
        cursor.execute("SELECT balance FROM accounts WHERE account_id= 1")
        final_balance = cursor.fetchone()[0]
        print(f"Solde final après rollback: {final_balance} €")
        print(f"La transaction a été annulée avec succès: {initial_balance == final_balance}")
        
    finally:
        if connection:
            cursor.close()
            connection.close()
if __name__ == "__main__":
 simulate_transaction_failure()